home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / os2 / pmcstex.zip / PM4EPM.E < prev    next >
Text File  |  1996-05-17  |  17KB  |  484 lines

  1. /* 
  2.   pm4epm.e
  3.  
  4.   PM for EPM. pm_command family: command with expansion dependend 
  5.   on the currently edited file
  6.  
  7.   c Petr Mikulík - Brno - Czech Republic - 20.2.1996
  8.   mikulik@physics.muni.cz, http://www.sci.muni.cz/~mikulik/
  9.  
  10.   Update for emtex options: 17.5.1996
  11.   Update for dvips options: 15.5.1996
  12.  */
  13.  
  14.  
  15. /* 
  16. USAGE: I use this macro file for actions on the EPM toolbar, and in the package 
  17. CSTeX that implements menu for many (La)TeX related commands.
  18.  
  19. INSTALLATION: 
  20.   1. cite this file (pm4epm) in the  actions.lst  file
  21.   2. write  include pm4epm  into your Profile.erx
  22.   3. You should have already installed EPMTeX and WETEX by Wagner
  23.  
  24. COMMANDS DEFINED HERE:
  25.  pm_expand           - expands the string and then executes it
  26.  pm_command_os2   - expands the string and runs it as os2 program
  27.  pm_command_os2fs - expands the string and runs full-screen os2 program
  28.  pm_command_cmd   - expands the string and runs it through cmd
  29.  pm_command_pm    - expands the string and runs it (only START)
  30.  pm_command_dos    - expands the string and runs it as dos program
  31.  pm_command_dosfs  - expands the string and runs full-screen dos program
  32.  etc. 
  33.  
  34. The expansion depends on the edited file (currently active file in the editor). 
  35.  
  36. SYNTAX of pm_expand WITH EXAMPLE: work file is e:\tmp\a.tex => 
  37.  
  38. Syntax   Internal Variable      Explanation                  Example
  39. %w      EFname               work file name               a
  40. %.w     EFext                  work file extension          tex
  41. %W      EFwholename         full name without extension e:\tmp\a
  42. %.W     EF                     full name                     e:\tmp\a.tex
  43.  
  44.  
  45. The same holds for the Master file specified by the MASTER: key (see below):
  46. %m     %.m   %M   %.M
  47.  
  48. Both types written in the Unix format (i.e. backslahes replaced by slashes): 
  49. %x %.x %X %.X  for the work file      e.g.  %.X = e:/tmp/a.tex
  50. %n %.n %N %.N  for the master file
  51.  
  52. %h MFdrive         drive of the master file (e:)
  53. %d MainDirectory   directory of the master file (\tmp)
  54. %D XMainDirectory directory in the Unix format (/home/petr/tex)
  55.  
  56. Key specifications: 
  57. The work file can have some of the following keyword written on its first line. 
  58. They are expanded as well according to this rules:
  59.  
  60. Syntax     Internal Variable   Introducing key word   If key not specified
  61. %master   MF                 Master:                 MF := EF
  62. %format   TheFormat         Format:                 envir. var. TEXFORMATDEFAULT 
  63.                                                          of "latex"                                                
  64. %etc      TheEtc              Etc:                    empty string
  65. %orient   TheOrient           Orientation:            empty string
  66. %choice   TheChoice          Choice:                 empty string
  67.  
  68. The following are expanded as verbatims, e.i. from the first char occuring after 
  69. the key to the next same char:
  70. %opts                         Opts:                   empty string
  71. %viewopts                     ViewOpts:               empty string
  72. %optsdvips                    dvips:                  empty string
  73. %optsemtex                    EmtexOpt:              empty string
  74.  
  75. The syntax $(Name) expands environmental variable Name
  76.  
  77.  
  78. *** Example 1 ***
  79. We edit file E:\TEXT\FERDA.TEX having the first line
  80. % Master: SEKORA.TEX  Format: latex209  Choice: none
  81.  
  82. Then commands are expanded:
  83. "copy %.W %W.old"     => "copy E:\TEXT\FERDA.TEX E:\TEXT\FERDA.old"
  84. "type %w%.w"          => "type FERDA.TEX"
  85. "%format.cmd %.N"     => "latex209.cmd E:/TEXT/SEKORA.TEX"
  86. "echo %choice *%etc*" => "echo none **"
  87.  
  88. *** Example 2 ***
  89. We edit file E:\TEXT\BROUK.TEX having the first line
  90. % ViewOpts: +/tr1 /m1440+ Etc: does not exist Opts: =any other=
  91. "start cmd /c cykl %.W %format.cmd %N" =>
  92.    "start cmd /c cykl E:\TEXT\BROUK.TEX latex.cmd E:/TEXT/BROUK"
  93. "start /fs dviscr %viewopts %M.dvi" =>
  94.   "start /fs dviscr /tr1 /m1440 e:\text\brouk.dvi"
  95.  
  96. */
  97.  
  98. include 'stdconst.e'
  99.  
  100.  
  101. /************************ CONSTANTS *********************************/
  102.  
  103. const
  104.  
  105.  PM_STARTos2   = 'start /C /WIN '
  106.  PM_STARTos2fs = 'start /C /FS '
  107.  PM_STARTcmd  = 'start /C /WIN cmd /c '
  108.  PM_STARTpm   = 'start '
  109.  PM_STARTdos   = 'start /C /WIN /DOS command.com /c '
  110.  PM_STARTdosfs = 'start /C /FS /DOS command.com /c '
  111.  
  112. /* Message strings */
  113.  
  114.  pm_expand_inf = "Expand command with: Work file: %w (name) %.w (ext) %W (path\name) %.W (full name); Main drive:\dir %d; 'MASTER:' file: %m %.m %M %.M; 'FORMAT:' %format 'ORIENTATION:' %orient; 'ETC:' %etc; 'CHOICE:' %choice; Verbatims: 'EMTEXOPT:' %optsemtex; 'DVIPS:' %optsdvips; 'VIEWOPTS:' %viewopts; 'OPTS:' %opts"
  115.  pm_command_os2_inf = "Expand command line (as pm_expand) and execute OS/2 exe program"
  116.  pm_command_os2fs_inf = "Expand command line (as pm_expand) and execute full-screen OS/2 exe program"
  117.  pm_command_cmd_inf = "Expand command line (as pm_expand) and execute .cmd file"
  118.  pm_command_pm_inf = "Expand command line (as pm_expand) and execute Prezentation Manager program"
  119.  pm_command_dos_inf = "Expand command line (as pm_expand) and execute dos exe program"
  120.  pm_command_dosfs_inf = "Expand command line (as pm_expand) and execute dos exe program (full screen)"
  121.  
  122.  
  123. /* The following command adds the action commands to the list */
  124.  
  125. DEFINIT
  126.   universal pm4epm_MasterNotFound
  127.  
  128. DEFC pm4epm_actionlist
  129. universal ActionsList_FileID
  130.  
  131.  insertline 'pm_expand'pm_expand_inf'pm4epm',ActionsList_FileID.last+1,ActionsList_FileID
  132.  insertline 'pm_command_cmd'pm_command_cmd_inf'pm4epm',ActionsList_FileID.last+1,ActionsList_FileID
  133.  insertline 'pm_command_os2'pm_command_os2_inf'pm4epm',ActionsList_FileID.last+1,ActionsList_FileID
  134.  insertline 'pm_command_os2fs'pm_command_os2fs_inf'pm4epm',ActionsList_FileID.last+1,ActionsList_FileID
  135.  insertline 'pm_command_pm'pm_command_pm_inf'pm4epm',ActionsList_FileID.last+1,ActionsList_FileID
  136.  insertline 'pm_command_dos'pm_command_dos_inf'pm4epm',ActionsList_FileID.last+1,ActionsList_FileID
  137.  insertline 'pm_command_dosfs'pm_command_dosfs_inf'pm4epm',ActionsList_FileID.last+1,ActionsList_FileID
  138.  
  139.  
  140.  
  141. /*************************** ROUTINES ******************************/
  142.  
  143. DEFPROC PM_GetNextWord ( WhichWord, line, uline )
  144. -- routine returns the next word after the keyword  WhichWord  or  WhichWord:
  145. i = wordpos(WhichWord,uline)
  146. if i=0 then i = wordpos(WhichWord':',uline) endif
  147. if i=words(uline) then i=0; TheWord='' endif
  148. if i<>0 then TheWord=word(line,i+1)
  149.          else TheWord='' 
  150.          endif
  151. return TheWord
  152.  
  153.  
  154. DEFPROC PM_GetNextWordOptions ( WhichWord, line, uline )
  155. -- routine scans for WhichWord. The first char of the next word as taken as the 
  156. -- key char. Then line is copied to TheOpts until the next key char appears. 
  157. -- This is similar to \verb*TheOpts...* in LaTeX
  158. i = wordpos(WhichWord,uline)
  159. if i=0 then i = wordpos(WhichWord':',uline) endif
  160. if i=words(uline) then i=0; TheOpts='' endif
  161. if i<>0 
  162.   then TheOpts=subword(line,i+1,words(line)-i)
  163.     KeyChar=substr(TheOpts,1,1); TheOpts=delstr(TheOpts,1,1)
  164.     i=pos(KeyChar,TheOpts)
  165.     if (i<>0) then TheOpts=substr(TheOpts,1,i-1) endif
  166.   else TheOpts=''
  167.   endif
  168. return TheOpts
  169.  
  170.  
  171. DEFPROC PM_SubstKeys ( TheCommand, TheKey, ByWhat )
  172. -- routine substitutes TheKey strings by ByWhat strings in TheCommand
  173. i = pos(TheKey,TheCommand)
  174. do while (i<>0)
  175.    l = length(TheKey)
  176.    TheCommand = substr(TheCommand,1,i-1)ByWhat''substr(TheCommand,i+l,length(TheCommand)-i-l+1)
  177.    i = pos(TheKey,TheCommand)
  178.    end
  179. return TheCommand
  180.  
  181.  
  182. DEFPROC PM_SubstEnvironment ( TheCommand )
  183. -- routine substitutes the environmental variables (like $(PATH)) within TheCommand
  184. i = pos('$(',TheCommand)
  185. do while (i<>0)
  186.    e = substr(TheCommand,i+2,length(TheCommand)-i-2)
  187.    TheCommand = substr(TheCommand,1,i-1)
  188.    i = pos(')',e)
  189.    if i>0 
  190.      then TheCommand=TheCommand''get_env(substr(e,1,i-1))''substr(e,i+1,length(e)-i-1)
  191.      else TheCommand=TheCommand''get_env(substr(e,1,length(e)))
  192.    endif
  193.    i = pos('$(',TheCommand)
  194.    end
  195. return TheCommand
  196.  
  197.  
  198. DEFPROC save_the_ring() =
  199. n = filesinring()
  200. for i = 1 to n
  201.   if .modify then call savefile(.filename); endif
  202.   nextfile
  203.   endfor
  204. return
  205.  
  206. DEFPROC InfoBox( title, text) = --Information box 
  207. call WinMessageBox( title, text, MB_OK + MB_MOVEABLE + MB_INFORMATION )
  208. return
  209.  
  210. /* ErrorBox */
  211. DEFPROC ErrorBox( title, text) =
  212. Beep(440, 133)
  213. call WinMessageBox( title, text, MB_OK + MB_MOVEABLE + MB_ERROR )
  214. return
  215.  
  216. /* Debug box */
  217. DEFPROC DebugBox( text ) =
  218. call WinMessageBox( 'Debugging', text, MB_OK + MB_MOVEABLE + MB_NOICON )
  219. return
  220.  
  221. /* Split file name into parts. Taken from ZWepmTeX.e by Z. Wagner */
  222. DEFPROC split_file_name(var drive, var path, var base, var ext, filespec) =
  223. fn = strip(filespec)
  224. if substr(fn, 2, 1) = ':' then
  225.   drive = substr(fn, 1, 2)
  226.   fn = substr(fn, 3)
  227. else drive = ''
  228. endif
  229. dotpos = lastpos('.', fn)
  230. bspos = lastpos('\', fn)
  231. if dotpos <= bspos then dotpos = length(fn) + 1; endif
  232. path = substr(fn, 1, bspos)
  233. base = substr(fn, bspos+1, dotpos-bspos-1)
  234. ext = substr(fn, dotpos)
  235. return
  236.  
  237. /**************************** DEFINE pm_command **********************/
  238.  
  239. DEFPROC pm_expansion ( TheCommand )
  240.   universal pm4epm_MasterNotFound;
  241.  
  242. /* Read the first line of the current file in order to find Main file */
  243. EF = .filename; MF = ''; 
  244. TheFormat=''; TheEtc=''; TheOrient=''; TheChoice=''; 
  245. TheOpts=''; TheViewOpts=''; TheDvips=''; TheEmtexOpt=''
  246. pm4epm_MasterNotFound=0 -- clear toggle
  247.  
  248. /*** Analysis of the first line of the current file ***/
  249.  
  250. /* search Master or Master: ; result goes to MF */
  251.  
  252. getline line, 1
  253. uline = translate(line)  -- uppercase
  254. --  parse value uline with . 'MASTER' ':' MF .    -- this would not be case sensitive
  255.  
  256. MF=PM_GetNextWord('MASTER',line,uline)
  257. if MF='' then MF=.filename; MFisEF=1
  258.          else MFisEF=0; MF = translate(MF,'\','/') -- convert from unix format
  259.          endif
  260.  
  261. -- the following deals with the case when user specifies only file name
  262. -- It work with absolute path, but not with relative paths having ..\
  263. if pos('\',MF)=0 then
  264.   if already_in_ring(MF,n) then  -- suggestion by kroni@bite.shnet.org, 16.5.1996
  265.       MF=n.filename
  266.     else
  267.       i=pos(':',MF); if i>0 then MF=substr(MF,i+1,length(MF)-i); endif -- no drive letter if specified MF=directory()'\'MF; 
  268.       MF=directory()'\'MF
  269.     endif
  270.   endif
  271.  
  272. if not exist(MF) then 
  273.     -- beep(444,222); sayerror 'Master file 'MF' not found!'
  274.     ErrorBox('Error','Master file 'MF' not found!')
  275.     pm4epm_MasterNotFound=1;
  276. --        return 
  277.     endif
  278.  
  279. /* fill MF-compliant variables */
  280.  
  281. -- oh... REXX has MFdrive = filespec("Drive",MF), but E not ! 
  282. call split_file_name(MFdrive, MFdir, MFname, MFext, MF)
  283. call split_file_name(EFdrive, EFdir, EFname, EFext, EF)
  284.  
  285. if (MFisEF==0) then -- files are different
  286.         if (MFdrive='') then MFdrive=EFdrive endif
  287.         if (MFdir='') then MFdir=EFdir endif
  288.         endif
  289.  
  290. MFdir = delstr(MFdir, length(MFdir)) -- del last backslash
  291. MainDirectory = MFdrive''MFDir
  292. MFext = delstr(MFext, 1,1) -- del .
  293. MFwholename = MainDirectory'\'MFname
  294.  
  295. EFext = delstr(EFext,1,1) -- del .
  296. if (MFisEF=1)
  297.     then  EFdrive=MFdrive; EFdir=MFdir
  298.         else  EFdir = delstr(EFdir, length(EFdir)) -- del last backslash
  299.     endif
  300. EFwholename = EFdrive''EFdir'\'EFname
  301.  
  302. /* Now master file MF and edit file EF are fully qualified. 
  303.     We should read the first line of the master file to get the information 
  304.     about Format, Orientation, Etc, Opts
  305. */
  306.  
  307. if (MFisEF=0) then -- read  line, uline  from Master
  308. if pfile_exists(MF) 
  309.     then  /* if Master file is in the ring */
  310.         getfileid working_fid
  311.         getfileid master_fid,MF
  312.         activatefile master_fid
  313.         getline line, 1
  314.         activatefile working_fid
  315.     else
  316.         'edit /d' MF
  317.         getfileid master_fid
  318.         getline line, 1
  319.         'quit'
  320.     endif
  321. uline = translate(line)
  322. endif
  323.  
  324. /*  Now parse   line   (note: uline is line in uppercase)  */
  325.  
  326. TheFormat=PM_GetNextWord('FORMAT',line,uline)
  327. if TheFormat='' then TheFormat=get_env('TEXFORMATDEFAULT') endif
  328. if TheFormat='' then TheFormat='latex' endif
  329.  
  330. TheOrient=PM_GetNextWord('ORIENTATION',line,uline)
  331.  
  332. TheEtc=PM_GetNextWord('ETC',line,uline)
  333.  
  334. TheChoice=PM_GetNextWord('CHOICE',line,uline)
  335.  
  336. -- TheOpts=PM_GetNextWord('OPTS',line,uline)
  337. TheOpts = PM_GetNextWordOptions('OPTS',line,uline)
  338. TheViewOpts = PM_GetNextWordOptions('VIEWOPTS',line,uline)
  339. TheDvips = PM_GetNextWordOptions('DVIPS',line,uline)
  340. TheEmtexOpt = PM_GetNextWordOptions('EMTEXOPT',line,uline)
  341.  
  342. /* Finally perform the substitution on TheCommand
  343. Not for those who want to expand this list: long commands (%opt) must precede 
  344.     the short ones (%o) ! 
  345. */
  346.  
  347. /* strings cannot be empty nor spaces since they will be chained */
  348.  
  349. if EFname='' then EFname=\250 endif
  350. if EFext='' then EFext=\250 endif
  351. if MFname='' then MFname=\250 endif
  352. if MFext='' then MFext=\250 endif
  353. if MainDirectory='' then MainDirectory=\250 endif
  354. if TheFormat='' then TheFormat=\250 endif
  355. if TheOrient='' then TheOrient=\250 endif
  356. if TheEtc='' then TheEtc=\250 endif
  357. if TheChoice='' then TheChoice=\250 endif
  358.  
  359. XMF = translate(MF,'/','\') -- convert to unix format
  360. XMFwholename = translate(MFwholename,'/','\')
  361. XEF = translate(EF,'/','\') 
  362. XEFwholename = translate(EFwholename,'/','\')
  363. XMainDirectory = translate(MainDirectory,'/','\')
  364.  
  365. Shorts = '%% ' -- hide %% sequence
  366. Longs = '!$PETR$! '
  367. Shorts = Shorts'%w %W %.w %.W '
  368. Longs  = Longs''EFname' 'EFwholename' 'EFext' 'EF ' '
  369. Shorts = Shorts'%m %M %.m %.M '
  370. Longs = Longs''MFname' 'MFwholename' 'MFext' 'MF' '
  371. Shorts = Shorts'%x %X %.x %.X '
  372. Longs  = Longs''EFname' 'XEFwholename' 'EFext' 'XEF ' '
  373. Shorts = Shorts'%n %N %.n %.N '
  374. Longs = Longs''MFname' 'XMFwholename' 'MFext' 'XMF' '
  375. Shorts = Shorts'%h %d %D '
  376. Longs = Longs''MFdrive' 'MainDirectory' 'XMainDirectory' '
  377. Shorts = Shorts'%choice %format %etc %orient '
  378. Longs = Longs''TheChoice' 'TheFormat' 'TheEtc' 'TheOrient' '
  379.  
  380. TheCommand=translate(TheCommand,'',\250) -- del those 250
  381.  
  382. /* replace single words */
  383.  
  384. do i = 1 to words(Shorts)
  385.   sh = word(Shorts, i)
  386.   p = pos(sh,TheCommand)
  387.   do while (p<>0)
  388.      l = length(sh)
  389.      TheCommand = substr(TheCommand,1,p-1)word(Longs,i)substr(TheCommand,p+l,length(TheCommand)-p-l+1)
  390.      p = pos(sh,TheCommand)
  391.      end
  392. end
  393.  
  394. /* replace single words by long words (verbatims) */
  395. TheCommand=PM_SubstKeys(TheCommand,'%optsemtex',TheEmtexOpt)
  396. TheCommand=PM_SubstKeys(TheCommand,'%optsdvips',TheDvips)
  397. TheCommand=PM_SubstKeys(TheCommand,'%opts',TheOpts)
  398. TheCommand=PM_SubstKeys(TheCommand,'%viewopts',TheViewOpts)
  399. TheCommand=PM_SubstKeys(TheCommand,'!$PETR$!','%%') -- restore %%
  400. TheCommand=PM_SubstEnvironment(TheCommand)
  401.  
  402. /*
  403. sayerror "RESULT="TheCommand
  404. WinMessageBox( 'PM for himself', 'Continue...', MB_OK + MB_MOVEABLE + MB_ERROR)
  405. better: DebugBox('RESULT='TheCommand)
  406. */
  407.  
  408. RETURN TheCommand
  409.  
  410.  
  411.  
  412. /**************************** DEFINE pm_command_cmd **********************/
  413.  
  414. DEFPROC pm_command_start ( action, HowStart, TheCommand, TheInfo )
  415.  
  416. if action = 'S' then    
  417.      /* button launched => replace %xxx sequences and run TheCommand */
  418.     if TheCommand='' then 
  419.         ErrorBox('Please define your action in the icon/edit/customization/parameters')
  420.         return
  421.         endif 
  422.     TheCommand=pm_expansion(TheCommand)
  423. -- how to detect if all is OK?
  424.     save_the_ring()
  425.     HowStart''TheCommand
  426.     return
  427.  
  428. /* this is obsolete now
  429. if (word(TheCommand,1)='-') 
  430.   then TheCommand=subword(TheCommand,2,words(TheCommand)-1)
  431.     sayerror 'STARTing 'TheCommand
  432.     'START 'TheCommand
  433.   elseif (word(TheCommand,1)='--') then
  434.     TheCommand=subword(TheCommand,2,words(TheCommand)-1)
  435. sayerror 'STARTing 'TheCommand
  436.     TheCommand
  437.   else  sayerror PMOS2cmd '"'TheCommand'"'
  438.     PMOS2cmd '"'TheCommand'"'
  439.   endif
  440. */
  441.  
  442. /**** HELP ACTION ****/
  443. elseif action ='H' then sayerror 'Here can be help window or sth like that'
  444. /**** INFO ACTION (button held on the icon) ****/
  445. elseif action ='I' then sayerror TheInfo
  446. else ErrorBox("Error", 'The action 'action' is not implemented')
  447. endif
  448. return
  449.  
  450. /**************** END OF pm_command_start *************************/
  451.  
  452.  
  453. DEFC pm_expand
  454. parse arg action TheCommand
  455. pm_command_start(action,'',TheCommand,pm_expand_inf)
  456.  
  457. DEFC pm_command_os2
  458. parse arg action TheCommand
  459. pm_command_start(action,PM_STARTos2,TheCommand,pm_command_os2_inf)
  460.  
  461. DEFC pm_command_os2fs
  462. parse arg action TheCommand
  463. pm_command_start(action,PM_STARTos2fs,TheCommand,pm_command_os2fs_inf)
  464.  
  465. DEFC pm_command_cmd
  466. parse arg action TheCommand
  467. -- InfoBox('DEFC','action='action'   TheCommand='TheCommand)
  468. pm_command_start(action,PM_STARTcmd,TheCommand,pm_command_cmd_inf)
  469.  
  470. DEFC pm_command_pm
  471. parse arg action TheCommand
  472. pm_command_start(action,PM_STARTpm,TheCommand,pm_command_pm_inf)
  473.  
  474. DEFC pm_command_dos
  475. parse arg action TheCommand
  476. pm_command_start(action,PM_STARTdos,TheCommand,pm_command_dos_inf)
  477.  
  478. DEFC pm_command_dosfs
  479. parse arg action TheCommand
  480. pm_command_start(action,PM_STARTdosfs,TheCommand,pm_command_dosfs_inf)
  481.  
  482. /* end of pm4EPM */
  483.  
  484.